import { login, logout, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import router, { resetRouter } from '@/router'

const state = {
    token: getToken(),
    name: '',
    avatar: '',
    introduction: '',
    roles: [],

    // 第1处修改，记得上面补上逗号
    permissions: []
}

const mutations = {
    SET_TOKEN: (state, token) => {
        state.token = token
    },
    SET_INTRODUCTION: (state, introduction) => {
        state.introduction = introduction
    },
    SET_NAME: (state, name) => {
        state.name = name
    },
    SET_AVATAR: (state, avatar) => {
        state.avatar = avatar
    },
    SET_ROLES: (state, roles) => {
        state.roles = roles
    },

    // 第2处修改，记得上面补上逗号
    SET_PERMISSIONS: (state, permissions) => {
        state.permissions = permissions
    }
}

const actions = {
    // user login
    login({ commit }, userInfo) {

        // const { username, password } = userInfo  // 第一处修改
        const username = userInfo.username.trim()
        const password = userInfo.password
        const uuid = userInfo.uuid

        return new Promise((resolve, reject) => {
            // login({ username: username.trim(), password: password }).then(response => {  // 第二处修改
            //     const { data } = response
            //     commit('SET_TOKEN', data.token)
            //     setToken(data.token)
            login(username, password, uuid).then(res => {
                setToken(res.token)
                commit('SET_TOKEN', res.token)

                resolve()
            }).catch(error => {
                reject(error)
            })
        })
    },

    // get user info
    // getInfo({ commit, state }) {
    //     return new Promise((resolve, reject) => {
    //         getInfo(state.token).then(response => {
    //             const { data } = response

    //             if (!data) {
    //                 reject('Verification failed, please Login again.')
    //             }

    //             const { roles, name, avatar, introduction } = data

    //             // roles must be a non-empty array
    //             if (!roles || roles.length <= 0) {
    //                 reject('getInfo: roles must be a non-null array!')
    //             }

    //             commit('SET_ROLES', roles)
    //             commit('SET_NAME', name)
    //             commit('SET_AVATAR', avatar)
    //             commit('SET_INTRODUCTION', introduction)
    //             resolve(data)
    //         }).catch(error => {
    //             reject(error)
    //         })
    //     })
    // },
    getInfo({ commit, state }) { // 第3处修改，改写getInfo，并添加fedLogOut
        return new Promise((resolve, reject) => {
            getInfo(state.token).then(res => {
                const user = res.user
                const avatar = user.avatar === '' ? require('@/assets/image/profile.jpg') : user.avatar
                if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
                    commit('SET_ROLES', res.roles)
                    commit('SET_PERMISSIONS', res.permissions)
                } else {
                    commit('SET_ROLES', ['ROLE_DEFAULT'])
                }
                commit('SET_NAME', user.username)
                commit('SET_AVATAR', avatar)
                resolve(res)
            }).catch(error => {
                reject(error)
            })
        })
    },
    // 前端登出
    fedLogOut({ commit }) {
        return new Promise(resolve => {
            commit('SET_TOKEN', '')
            removeToken()
            resolve()
        })
    },



    // user logout
    logout({ commit, state, dispatch }) {
        return new Promise((resolve, reject) => {
            logout(state.token).then(() => {
                commit('SET_TOKEN', '')
                commit('SET_ROLES', [])
                removeToken()
                resetRouter()

                // reset visited views and cached views
                // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
                dispatch('tagsView/delAllViews', null, { root: true })

                resolve()
            }).catch(error => {
                reject(error)
            })
        })
    },

    // remove token
    resetToken({ commit }) {
        return new Promise(resolve => {
            commit('SET_TOKEN', '')
            commit('SET_ROLES', [])
            removeToken()
            resolve()
        })
    },

    // dynamically modify permissions
    async changeRoles({ commit, dispatch }, role) {
        const token = role + '-token'

        commit('SET_TOKEN', token)
        setToken(token)

        const { roles } = await dispatch('getInfo')

        resetRouter()

        // generate accessible routes map based on roles
        const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
            // dynamically add accessible routes
        router.addRoutes(accessRoutes)

        // reset visited views and cached views
        dispatch('tagsView/delAllViews', null, { root: true })
    }
}

export default {
    namespaced: true,
    state,
    mutations,
    actions
}